generic
   type individu (<>) is private;
   type cercle (<>) is private;
   type texte (<>) is private;
   type mur (<>) is private;
   with function creer (m : individu) return mur is <>;
   with function afficher (mu : mur; m : individu; t : texte; i : natural) return mur is <>;
   with function est_defini (mu : mur; i : natural) return boolean is <>;
   with function auteur (mu : mur; i : natural) return individu is <>;
   --with function nombre_posts_mur (mu : mur) return natural is <>;
   with function to_string(mu : mur) return string is <>;
   with function ieme_post (mu : mur; i : natural) return texte is <>;
   with function "<=" (m, n : individu) return boolean is <>;
   with function "<=" (c, d : cercle) return boolean is <>;

package Communautes is
   --generic sur individus, cercles, textes(non constants)
   type communaute is abstract tagged private;
   function creer return communaute is abstract;

-----------------------------------------------------------------------------------------------
------------------- LES INDIVIDUS DE LA COMMUNAUTE---------------------
-----------------------------------------------------------------------------------------------

   function inscrire (x : communaute; n : individu) return communaute is abstract;
   function est_inscrit (x : communaute; n : individu) return boolean is abstract;
   function nombre_inscrits (x : communaute) return natural is abstract;
   function ieme_inscrit (x : communaute; i : natural) return individu is abstract;
   function bloquer (x : communaute; m : individu; n : individu) return communaute is abstract;
   function debloquer (x : communaute; m : individu; n : individu) return communaute is abstract;
   function est_bloque (x : communaute; m : individu; n : individu) return boolean is abstract;

------------------------------------------------------------------------------
------------------- LES CERCLES D'UN INDIVIDU --------------------------------
------------------------------------------------------------------------------

   function est_cercle_de (x : communaute; n : individu; c : cercle) return boolean is abstract;
   function ajouter_cercle (x : communaute; n : individu; c : cercle) return communaute is abstract;
   function retirer_cercle (x : communaute; n : individu; c : cercle) return communaute is abstract;
   function nombre_cercles_de (x : communaute; n : individu) return natural is abstract;
   function ieme_cercle (x : communaute; n : individu; i : natural) return cercle is abstract;

-----------------------------------------------------------------------------------------------
------------------- LES MEMBRES D'UN CERCLE -------------------------------
-----------------------------------------------------------------------------------------------

   function est_membre_de (x : communaute; m : individu; c : cercle; n : individu) return boolean is abstract;
   function ajouter_membre (x : communaute; n : individu; c : cercle; p : individu) return communaute is abstract;
   function retirer_membre (x : communaute; n : individu; c : cercle; p : individu) return communaute is abstract;
   function nombre_membres_de (x : communaute; n : individu; c : cercle) return natural is abstract;
   function ieme_membre (x : communaute; n : individu; c : cercle; i : natural) return individu is abstract;

-----------------------------------------------------------------------------------------------
------------------- POSTS ET COMMENTAIRES ----------------------------------
---------------------------------------------------------------------------------------
   function poster(x : communaute; n : individu; c : cercle; t : texte) return communaute is abstract;
   function commenter(x : communaute; n : individu; i : natural; t : texte) return communaute is abstract;
   function nombre_posts(x : communaute) return natural is abstract;
   function consulter(x : communaute; n : individu) return mur is abstract;

private
   type communaute is abstract tagged null record;
end Communautes;
